//
//  ZYImageDecoderFactory.m
//  ZYWebImage
//
//  Created by wangzhipan on 2025/3/6.
//

#import "ZYImageDecoderFactory.h"
#import "ZYPNGDecoder.h"
#import "ZYJPEGDecoder.h"
#import "ZYWebpDecoder.h"
#import "ZYGifDecoder.h"
#import "ZYUnknowDecoder.h"

@implementation ZYImageDecoderFactory
+ (id<IZYDecoder>)createDecoderForData:(NSData *)data
{
    if (!data || data.length == 0) {
        return 0;
    }
    uint8_t byte;
    [data getBytes:&byte length:1];
    
    switch (byte) {
        case 0xFF: // JPEG 以 0xFF 开头
            return [[ZYJPEGDecoder alloc] initWithData:data];
        case 0x89: // PNG 以 0x89 开头
            return [[ZYPNGDecoder alloc] initWithData:data];
        case 0x47: // GIF 以 'G' 开头
            return [[ZYGifDecoder alloc] initWithData:data];
        case 0x52: // WebP 以 'RIFF' 开头
            if (data.length >= 12) {
                NSString *typeStr = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(8, 4)] encoding:NSASCIIStringEncoding];
                if ([typeStr isEqualToString:@"WEBP"]) {
                    return [[ZYWebpDecoder alloc] initWithData:data];
                }
            }
            break;
    }
    
    // 未知格式，尝试使用系统解码
    return [[ZYUnknowDecoder alloc] initWithData:data];
}

+ (id<IZYDecoder>)createDecoderForData:(NSData *)data format:(ZYImageFormat)format
{
    if (!data || data.length == 0) {
        return 0;
    }
    
    switch (format) {
        case ZYImageFormatJpeg: // JPEG 以 0xFF 开头
            return [[ZYJPEGDecoder alloc] initWithData:data];
        case ZYImageFormatPng: // PNG 以 0x89 开头
            return [[ZYPNGDecoder alloc] initWithData:data];
        case ZYImageFormatGif: // GIF 以 'G' 开头
            return [[ZYGifDecoder alloc] initWithData:data];
        case ZYImageFormatWebp: // WebP 以 'RIFF' 开头
            return [[ZYWebpDecoder alloc] initWithData:data];
    }
    
    // 未知格式，尝试使用系统解码
    return [[ZYUnknowDecoder alloc] initWithData:data];
}
@end
